package br.com.hs.nfe.common.to;

import br.com.hs.nfe.common.anotation.AnotationConstants;
import br.com.hs.nfe.common.anotation.DocumentTypeEnum;
import br.com.hs.nfe.common.anotation.Element;
import br.com.hs.nfe.common.anotation.Node;
import br.com.hs.nfe.common.anotation.TypeEnum;
import br.com.hs.nfe.common.enumeration.UFEnum;
import br.com.hs.nfe.common.validation.Validable;
import br.inf.portalfiscal.nfe.TEnderEmi;
import br.inf.portalfiscal.nfe.TUf;
import br.inf.portalfiscal.nfe.TUfEmi;
import br.inf.portalfiscal.nfe.Tpais;

/**
 * Classe para endereços da NFe.
 * @author Ranlive Hrysyk
 */
@Node(id = AnotationConstants.CONSTANT_ID, name = "Endereço")
public class EnderecoTO extends BaseTO implements Validable {

    @Element(publicName = "Logradouro", type = TypeEnum.CARACTER, min = 2, max = 60)
    private String xLgr;
    @Element(publicName = "Número", type = TypeEnum.CARACTER, min = 1, max = 60)
    private String nro;
    @Element(publicName = "Complemento", type = TypeEnum.CARACTER, min = 1, max = 60, required = false)
    private String xCpl;
    @Element(publicName = "Bairro", type = TypeEnum.CARACTER, min = 2, max = 60)
    private String xBairro;
    @Element(publicName = "Código do Município", type = TypeEnum.NUMBER, min = 7, max = 7, document = DocumentTypeEnum.CMUN)
    private String cMun;
    @Element(publicName = "Nome do Município", type = TypeEnum.CARACTER, min = 2, max = 60)
    private String xMun;
    @Element(elementName = "UF", publicName = "Sigla da UF", type = TypeEnum.ENUM, classType = {TUfEmi.Enum.class, TUf.Enum.class})
    private UFEnum uf;
    @Element(elementName = "CEP", publicName = "CEP", type = TypeEnum.NUMBER, min = 8, max = 8)
    private String cep;
    @Element(publicName = "Código do País", type = TypeEnum.ENUM, min = 4, max = 4, required = false, classType = {TEnderEmi.CPais.Enum.class, Tpais.Enum.class}, document = DocumentTypeEnum.CPAIS)
    private String cPais;
    @Element(publicName = "Nome do País", type = TypeEnum.ENUM, min = 1, max = 60, required = false, classType = {TEnderEmi.XPais.Enum.class, String.class})
    private String xPais;
    @Element(publicName = "Telefone", type = TypeEnum.NUMBER, min = 6, max = 14, required = false)
    private String fone;
    
    /**
     * Logradouro.
     */
    public String getXLgr() {
        return xLgr;
    }

    /**
     * Informar o logradouro.
     * @param xLgr Logradouro
     */
    public void setXLgr(String xLgr) {
        this.xLgr = xLgr;
    }

    /**
     * Número.
     */
    public String getNro() {
        return nro;
    }

    /**
     * Informar o número.
     * @param nro Número
     */
    public void setNro(String nro) {
        this.nro = nro;
    }

    /**
     * Complemento.
     */
    public String getXCpl() {
        return xCpl;
    }

    /**
     * Informar o complemento.
     * @param xCpl Complemento
     */
    public void setXCpl(String xCpl) {
        this.xCpl = xCpl;
    }

    /**
     * Bairro.
     */
    public String getXBairro() {
        return xBairro;
    }

    /**
     * @param xBairro Bairro
     */
    public void setXBairro(String xBairro) {
        this.xBairro = xBairro;
    }

    /**
     * Código do Município.
     */
    public String getCMun() {
        return cMun;
    }

    /**
     * Informar o código do município.
     * @param cMun Código do Município
     */
    public void setCMun(String cMun) {
        this.cMun = cMun;
    }

    /**
     * Nome do Município.
     */
    public String getXMun() {
        return xMun;
    }

    /**
     * Informar o nome do município.
     * <p><i>Informar "<b>EXTERIOR</b>" para operações com o exterior.</i></p>
     * @param xMun Nome do Município
     */
    public void setXMun(String xMun) {
        this.xMun = xMun;
    }

    /**
     * Sigla da UF.
     */
    public String getUF() {
        if (uf != null) {
            return uf.getUF();
        }
        return null;
    }

    /**
     * Sigla da UF.
     */
    public UFEnum getUFEnum() {
        return uf;
    }

    /**
     * Informar a sigla da UF.
     * <p><i>Informar "<b>EX</b>" para operações com o exterior.</i></p>
     * @param uf Sigla da UF
     */
    public void setUF(String uf) {
        this.uf = UFEnum.getEnumByUF(uf);
    }

    /**
     * Informar a sigla da UF.
     * <p><i>Informar "<b>EX</b>" para operações com o exterior.</i></p>
     * @param uf Sigla da UF
     */
    public void setUFEnum(UFEnum uf) {
        this.uf = uf;
    }

    /**
     * Código do CEP.
     */
    public String getCEP() {
        return cep;
    }

    /**
     * Informar o código do CEP.
     * <p><i>Informar os zeros não significativos.</i></p>
     * @param cep Código do CEP
     */
    public void setCEP(String cep) {
        this.cep = cep;
    }

    /**
     * Código do Pais.
     */
    public String getCPais() {
        return cPais;
    }

    /**Informar o código do país.
     * @param cPais Código do País
     */
    public void setCPais(String cPais) {
        this.cPais = cPais;
    }

    /**
     * Nome do País.
     */
    public String getXPais() {
        return xPais;
    }

    /**
     * Informar o nome do país.
     * @param xPais Nome do País
     */
    public void setXPais(String xPais) {
        this.xPais = xPais;
    }

    /**
     * Telefone.
     */
    public String getFone() {
        return fone;
    }

    /**
     * Informar o telefone.
     * <p><i>Preencher com o código DDD + número do telefone. Nas operações com 
     * exterior é permitido informar o código do país + código da localidade + número do telefone.</i></p>
     * @param fone Telefone
     */
    public void setFone(String fone) {
        this.fone = fone;
    }
}
